#ifndef IHELLOSERVICE_H
#define IHELLOSERVICE_H

#include <utils/Errors.h>  // for status_t
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>
#include <utils/String8.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>

#define HELLO_SVR_CMD_SAYHELLO     1
#define HELLO_SVR_CMD_SAYHELLO_TO  2

namespace android {

/**
 * 协议类：
 * 即：Server端提供了哪些函数供Client端调用
 */
class IHelloService: public IInterface {

public:
    //宏定义，声明了一些变量和函数
    DECLARE_META_INTERFACE(HelloService);
    //Binder 对外提供服务功能
	virtual void sayHello() = 0;
	virtual int sayHelloTo(const char *name) = 0;
	
};

/**
 * 服务端
 * 一般Bn开头，意思应该是Binder Native。包括了BBinder，BnInterface，BnHelloService 
 */
class BnHelloService: public BnInterface<IHelloService> {

public:
    //服务端收到数据时，会回调该函数
    status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
    void sayHello();
    int sayHelloTo(const char *name);
};

/**
 * 客户端
 * 一般Bp开头，意思应该是Binder Proxy。包括了BpBinder，BpRefBase，BpInterface,BpHelloService
 */
class BpHelloService: public BpInterface<IHelloService> {
public:
    BpHelloService(const sp<IBinder>& impl);
    void sayHello();
    int sayHelloTo(const char *name);
};

}

#endif